/* component */
import UserCard from '@src/modules/task/components/TaskAllotModal/UserCard/UserCard.tsx'
/* enum */
import AuthEnum from '@model/enum/AuthEnum'
import TaskStateEnum from '@model/enum/TaskStateEnum'
import TaskAllotTypeEnum from '@model/enum/TaskAllotTypeEnum'
import ComponentNameEnum from '@model/enum/ComponentNameEnum'
/* entity */
import Field from '@model/entity/Field'
/* data */
import TaskAllotModalData from '@src/modules/task/components/TaskAllotModal/TaskAllotModalData'
/* util */
import { findComponentDownward } from '@src/util/assist'
import { getRootWindow } from '@src/util/dom'
/* types */
import TaskConfig from '@model/config/TaskConfig'
import { getRootWindowInitData } from '@src/util/window';

class TaskAllotModalComputed extends TaskAllotModalData {
  
  get allotContentStyle() {
    return {
      [TaskAllotTypeEnum.Person]: { display: this.allotType === TaskAllotTypeEnum.Person ? 'block' : 'none' },
      [TaskAllotTypeEnum.Pool]: { display: this.allotType === TaskAllotTypeEnum.Pool ? 'block' : 'none' },
      [TaskAllotTypeEnum.Auto]: { display: this.allotType === TaskAllotTypeEnum.Auto ? 'block' : 'none' },
      [TaskAllotTypeEnum.ServiceProvider]: { display: this.allotType === TaskAllotTypeEnum.ServiceProvider ? 'block' : 'none' },

    }
  }
  
  /** 
   * @description 是否允许修改协同人
   *  1. 状态为 已指派 已接受 进行中 其中一个, PC端开启允许修改协同人，并且是负责人
   *  2. 工单创建人
   *  3. 编辑工单权限
  */
  get allowModifySynergyUser(): boolean {
    let states = [TaskStateEnum.ALLOCATED.value, TaskStateEnum.ACCEPTED.value, TaskStateEnum.PROCESSING.value]
    let allowModify = this.taskConfig.taskSynergy
    let authorities = this.loginUser?.authorities || {}
    
    return Boolean(
      (states.indexOf(this.task?.state) >= 0 && allowModify && this.isExecutor)
      || this.isCreator
      || authorities[AuthEnum.TASK_EDIT]
    )
  }
  
  /* 客户id */
  get customerId() {
    return this.task?.customer?.id || ''
  }
  
  /** 
   * @description 是否是工单创建人
  */
  get isCreator(): boolean {
    let loginUser = this.loginUser || {}
    let createUser = this.task?.createUser || {}
    return Boolean(createUser.userId && loginUser.userId && createUser.userId == loginUser.userId)
  }
  
  /** 
   * @description 是否是工单负责人
  */
  get isExecutor(): boolean {
    let loginUser = this.loginUser || {}
    let executorUser = this.task?.executor || {}
    return Boolean(executorUser.userId && loginUser.userId && executorUser.userId == loginUser.userId)
  }
  
  /** 
   * @description 是否显示工单池组件
  */
  get isShowTaskPoolComponent() {
    return this.loadedComponents.includes(ComponentNameEnum.TaskAllotPool)
  }
  
  /** 
   * @description 是否显示自动派单组件
  */
  get isShowTaskAutoDispatchComponent() {
    return this.loadedComponents.includes(ComponentNameEnum.TaskAllotAuto)
  }

  /** 
   * @description 是否显示服务商组件
  */
  get isShowTaskAllotServiceProviderComponent() {
    return this.loadedComponents.includes(ComponentNameEnum.TaskAllotServiceProvider)
  }
  
  /**
   * @description 是否显示工单池类型
   * 1. 工单设置 -> 工单池 开启
   * 2. 且该工单目前不在工单池中
   * 3. 指派 或 转派并开启 转派工单池设置
   */
  get isShowTaskPoolType(): boolean {
    return Boolean(
      this.taskConfig.taskPoolOn === true
      && !this.isTaskInTaskPool
      && (!this.isReAllot || (this.isReAllot && this.taskConfig.reallotToPool === true))
    )
  }
  
  /**
   * @description 是否显示自动派单类型
   * 1. 工单设置 -> 自动派单 开启
   * 2. 且非转派 (仅支持指派)
   */
  get isShowAutoDispatchType(): boolean {
    return Boolean(this.taskConfig.autoDispatch === true && !this.isReAllot)
  }

  /**
   * @description 是否将转派人添加为协同人
   * 1. 工单设置 -> 派单设置 -> 是否将转派人添加为协同人 开启
   * 2. 仅支持转派
   */
  get isShowAssignorToSynergyUser(): boolean {
    return Boolean(this.newTaskConfig?.TASK_RE_ALLOT_EXECUTOR_AS_SYNERGIES?.isOpen)
  }

  /**
   * @description 是否显示派单到服务商类型
   * 灰度控制
   */
  get isShowServiceProviderType(): boolean {
    const RootWindow = getRootWindow(window);
    return RootWindow.grayAuth?.providerManager || false;
  }

  
  /**
   * @description 是否是派单到服务商的工单
   */
  get isServiceProviderTask(): boolean {
    let status = false
    // TODO 只有内部人员可以转派且任何情况都可以转派，isProviderUser 服务商 true
    let isProviderUser = getRootWindowInitData()?.isProviderUser || false;
    // 负责工单的服务商id
    // const serviceProviderId = this.createEditTask?.serviceProviderId || this.task?.serviceProviderId
    // 创建工单的服务商id
    // const serviceProviderCreateId = this.task?.serviceProviderCreateId
    // if (serviceProviderId || serviceProviderCreateId) {
    //   status = true
    // }
    return isProviderUser
  }
  /** 
   * @description 当前工单是否在工单池中
  */
  get isTaskInTaskPool(): boolean {
    return this.task?.state === TaskStateEnum.TASK_POOL.value
  }
  
  /** 
   * @description 转派说明是否必填
  */
  get reallotRemarkNotNull(): boolean {
    return this.taskConfig?.reallotRemarkNotNull === true
  }
  
  /** 
   * @description 是否是工单创建人
   * -- 供外部获取的
  */
  get outsideIsCreator(): boolean {
    return this.isCreator
  }
  
  /** 
   * @description 是否是工单负责人
   * -- 供外部获取的
  */
  get outsideIsExecutor(): boolean {
    return this.isExecutor
  }
  
  /** 
   * @description 工单字段列表
   * -- 供外部获取的
  */
  get outsideFields(): Field[] {
    return this.fields || []
  }
  
  /** 
   * @description 工单信息
   * -- 供外部获取的
  */
  get outsideTask(): any {
    return this.task
  }
  
  /** 
   * @description 工单配置
   * -- 供外部获取的
  */
  get outsideTaskConfig(): TaskConfig {
    return this.taskConfig
  }
  
  /* 工单派单负责人地图 人员卡片组件 */
  get UserCardComponentWithTaskAllotExecutorMap(): UserCard {
    return findComponentDownward(this.TaskAllotExcutorComponent, ComponentNameEnum.UserCard)
  }
  
  /* 工单派单负责人地图 人员卡片组件 */
  get UserCardComponentWithTaskAllotPool(): UserCard {
    return findComponentDownward(this.TaskAllotPoolComponent, ComponentNameEnum.UserCard)
  }
}

export default TaskAllotModalComputed
